%{
	/*definições das constantes manifestas
	LT,LE,EQ,NE,GT,GE
	IF,THEN,ELSE,ID,NUMERO,RELOP */
	#define LT 1
	#define LE 2
	#define EQ 3
	#define NE 4
	#define GT 5
	#define GE 6
	#define IF 7	
	#define THEN 8
	#define ELSE 9
	#define ID 10
	#define NUMERO 11
	#define RELOP 12
	int yylval = 0;
	

%}

/* definições regulares */
delim	[ \t\n]
ws	{delim}+
letra	[A-Za-z]
digito  [0-9]
espechar ("."|","|";"|"("|"*")
id	{letra}({letra}|{digito})*
float	[\-]?{digito}+(\.{digito}+)(E[+\-]?{digito}+)?
numero  [\-]?{digito}
string  	\"({delim}|{letra}|{digito}|{espechar})*\"
char		\'({delim}|{letra}|{digito}|{espechar})\'
pointerDec 	\^{id}
pointerVar 	{id}\^


%%



{ws}		{/*nenhuma ação e nenhum valor retornado */}
var		{printf(" Var ");return (VAR);}
const		{printf(" Const ");return (CONST);}
program		{printf(" Program ");return (PROGRAM);}
repeat		{printf(" repeat ");return (REPEAT);}
type		{printf(" type ");return (TYPE);}
then		{printf(" then ");return (THEN);}
if		{printf(" if ");return (IF);}
else		{printf(" else ");return (ELSE);}
for		{printf(" for ");return (FOR)	;}
while		{printf(" while ");return (WHILE);}		
do		{printf(" do ");return (DO);}
begin		{printf(" Begin ");return (BEGIN);}
end		{printf(" End ");return (END);}
to		{printf(" TO ");return (TO);}
step		{printf(" step ");return (STEP);}
downto		{printf(" downto ");return (DOWNTO);}
procedure	{printf(" procedure ");return (PROCEDURE);}
function	{printf(" function ");return (FUNCTION);}
record		{printf(" record ");return (RECORD);}
array		{printf(" array ");return (ARRAY);}
":"		{printf(" dois-pontos ");return (DOISPONTOS);}
until		{printf(" until ");return (UNTIL);}
writeln		{printf(" writeln ");return (WRITELN);}
readln		{printf(" readln ");return (READLN);}
aspect		{printf(" aspect ");return (ASPECT);}
before		{printf(" before ");return (BEFORE);}
after		{printf(" after ");return (AFTER);}
true		{printf(" true ");return (TRUE);}
false		{printf(" false ");return (FALSE);}
case		{printf(" case ");return (CASE);}
boolean		{printf(" boolean ");return (BOOLEAN);}
string		{printf(" string ");return (STRING_TYPE);}
char		{printf(" char ");return (CHAR);}
".."		{printf(" range ");return (RANGE);}
real		{printf(" real ");return (REAL);}
then		{printf(" then ");return (THEN);}













{pointerDec}	{printf(" pointer dec ");yylval = instalar_id();return (POINTER_DEC);}
{pointerVar}	{printf(" pointer var ");yylval = instalar_id();return (POINTER_VAR);}

{string}	{printf(" string\n");return (STRING_TERM);}
{char}		{printf(" char\n");return (CHAR_TERM);}
"+"		{printf(" adicao ");return (ADICAO);}
"*"		{printf(" ARITMETICO ");yylval = MULTI ;return (ARITMETICO);}
"/"		{printf(" ARITMETICO ");yylval = DIV; return (ARITMETICO);}
"%"		{printf(" ARITMETICO ");yylval = MOD; return (ARITMETICO);}
"-"		{printf(" ARITMETICO ");yylval = MINUS; return (ARITMETICO);}
"!"		{printf(" not ") ;return (ARITMETICO);}
":="		{printf(" atribuicao ");return (ATRIBUICAO);}
";"		{printf(" pontivirgula ");return (PONTIVIRGULA);}		

"["		{printf(" AbreCol ");return (ABRECOL);}
"]"		{printf(" FechaCol ");return (FECHACOL);}
"("		{printf(" AbrePar ");return (ABREPAR);}
")"		{printf(" FechaPar ");return (FECHAPAR);}
"."		{printf(" ponto ");return (PONTO);}
","		{printf(" virgula ");return (VIRGULA);}			

{numero}	{printf(" numero ");return (1);}
{id}		{printf(" id ");yylval = instalar_id();return (ID);}
{float} 	{printf(" float ");yylval = instalar_num(); return (NUMERO);}
"<"		{printf(" < ");yylval = LT; return (RELOP);}
"<="		{printf(" <= ");yylval = LE; return (RELOP);}
"=="		{printf(" = ");yylval = EQ; return (RELOP);}
"!="		{printf(" <> ");yylval = NE; return (RELOP);}
">"		{printf(" > ");yylval = GT; return (RELOP);}
">="		{printf(" >= ");yylval = GE; return (RELOP);}


%%

int instalar_id(){
	/* procedimento para instalar o lexema, cujo primeiro caractere é apontado por yytext e cujo comprimento é yyleng, na tabela de símbolos e retornar um apontador para o mesmo */
	return 2;
}

int instalar_num(){
	/* procedimento similar para instalar um lexema que seja um número */
	return 1;
}



